package src.tree;

import java.util.*;

public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode next;

    TreeNode(int x) {
        val = x;
    }

    TreeNode(int x, TreeNode left, TreeNode right) {
        val = x;
        this.left = left;
        this.right = right;
    }

    TreeNode() {
    }

    /**
     * 创建二叉树,  1,null,2,3 变成以下二叉树
     *          1
     *         / \
     *      null  2
     *           / \
     *          3   null
     *
     * @param list
     * @return TreeNode
     */
    public static TreeNode createTree(ArrayList list) {
        TreeNode root = new TreeNode((Integer) list.get(0));
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        for (int i = 1; i < list.size(); ) {
            TreeNode node = queue.poll();
            if (list.get(i) != null) {
                node.left = new TreeNode((Integer) list.get(i));
                queue.add(node.left);
            }
            i++;
            if (i == list.size()) {
                break;
            }
            if (list.get(i) != null) {
                node.right = new TreeNode((Integer) list.get(i));
                queue.add(node.right);
            }
            i++;
        }
        return root;
    }

    public static  void putTree(TreeNode root) {
        putTree(root, 0);
    }

    public static  void putTree(TreeNode root, Integer deep) {
        if (root == null) {
            return;
        }

        for(int i = 0; i < deep; i++) System.out.print("   ");
        System.out.println(root.val);
        putTree(root.left, deep + 1);
        putTree(root.right, deep + 1);
    }
}





//public class TreeNode {
//    E val;
//    TreeNode left;
//    TreeNode right;
//
//    TreeNode(E x) {
//        val = x;
//    }
//
//    TreeNode(E x, TreeNode left, TreeNode right) {
//        val = x;
//        this.left = left;
//        this.right = right;
//    }
//
//    TreeNode() {
//    }
//
//    /**
//     * 创建二叉树,  1,null,2,3 变成以下二叉树
//     *          1
//     *         / \
//     *      null  2
//     *           / \
//     *          3   null
//     *
//     * @param list
//     * @return TreeNode
//     */
//    public static  TreeNode createTree(ArrayList list) {
//        TreeNode root = new TreeNode(list.get(0));
//        Queue<TreeNode> queue = new LinkedList<>();
//        queue.add(root);
//        for (int i = 1; i < list.size(); ) {
//            TreeNode node = queue.poll();
//            if (list.get(i) != null) {
//                node.left = new TreeNode(list.get(i));
//                queue.add(node.left);
//            }
//            i++;
//            if (i == list.size()) {
//                break;
//            }
//            if (list.get(i) != null) {
//                node.right = new TreeNode(list.get(i));
//                queue.add(node.right);
//            }
//            i++;
//        }
//        return root;
//    }
//
//    public static  void putTree(TreeNode root) {
//        putTree(root, 0);
//    }
//
//    public static  void putTree(TreeNode root, Integer deep) {
//        if (root == null) {
//            return;
//        }
//
//        for(int i = 0; i < deep; i++) System.out.print("   ");
//        System.out.println(root.val);
//        putTree(root.left, deep + 1);
//        putTree(root.right, deep + 1);
//    }
//}
